import requests
from bs4 import BeautifulSoup
import pandas as pd

def get_movie_info(session, url):
    response = session.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')

    movie_list = []
    for item in soup.find_all('div', class_='item'):
        title = item.find('span', class_='title').text
        rating = item.find('span', class_='rating_num').text
        info = item.find('div', class_='bd').find('p').text.strip().split('\n')
        director_and_actors = info[0].strip().split('\xa0\xa0\xa0')
        movie_info = {
            'title': title,
            'rating': rating,
            'director': director_and_actors[0].replace('导演: ', '').strip(),
            'actors': director_and_actors[1].replace('主演: ', '').strip() if len(director_and_actors) > 1 else '',
            'year': info[1].strip().split('/')[0].strip(),
            'country': info[1].strip().split('/')[1].strip(),
            'genre': info[1].strip().split('/')[-1].strip()
        }
        movie_list.append(movie_info)
    return movie_list

def main():
    base_url = 'https://movie.douban.com/top250?start={}&filter='
    all_movies = []

    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
    }

    # 使用 requests.Session 保持会话
    with requests.Session() as session:
        session.headers.update(headers)

        # 豆瓣 Top 500 电影分为 20 页显示，每页 25 部电影
        for i in range(20):
            url = base_url.format(i * 25)
            print(f"正在爬取第 {i + 1} 页：{url}")  # 打印正在爬取的页面
            movies = get_movie_info(session, url)
            print(f"第 {i + 1} 页电影数量：{len(movies)}")  # 打印当前页面获取到的电影数量
            all_movies.extend(movies)

    print(f"总共爬取到 {len(all_movies)} 部电影")  # 打印总共爬取到的电影数量

    df = pd.DataFrame(all_movies)
    df.to_excel('douban_top500_movies.xlsx', index=False)

if __name__ == '__main__':
    main()

#在这个修改后的代码中，我们创建了一个 `requests.Session` 对象并为其添加了请求头。这可以帮助我们模拟浏览器访问网站，降低被反爬措施拦截的风险。
#请尝试运行此代码，查看是否能够成功爬取豆瓣 Top 500 电影信息。如果仍然无法获取数据，请确保遵守网站的爬虫政策，并考虑使用其他方法应对反爬措施，如添加延时、使用代理等。